﻿using System;
using System.Collections.Generic;
using System.Configuration;
using ClickLand.CorporacionPlaza.Comunes.Recursos;
using Logger;
using System.Data;
using System.Reflection;
using ClickLand.CorporacionPlaza.AccesoDato.Contratos;
using ClickLand.CorporacionPlaza.Comunes.Entidades;
using MySql.Data.MySqlClient;
using NHibernate;

namespace ClickLand.CorporacionPlaza.AccesoDato.Implementacion.NHibernateMySql
{
    /// <summary> Clase que implementa el contrato IDaoContrato  </summary>
    public class DaoContratoNHibernateMySql : DaoBase<Contrato>, IDaoContrato
    {
        public int InsertarCompleto(Contrato contrato)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Logger.Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            int exito = -1;

            try
            {
                ITransaction tx = Session.BeginTransaction();
                Session.Save(contrato);
                
                tx.Commit();
                exito = (int) contrato.Id;
            }
            catch (NullReferenceException e)
            {
                #region Instrumentacion Error
                if (Log.InfoHabilitado)
                    Logger.Log.Info(e.Message + " " + e.InnerException);
                #endregion
                Session.Transaction.Rollback();
                Log.Error(e.Message);
                Log.Error(e.InnerException.Message);

                throw e;
            }
            catch (Exception e)
            {
                #region Instrumentacion Error
                if (Log.InfoHabilitado)
                    Logger.Log.Info(e.Message + " " + e.InnerException);
                #endregion
                Session.Transaction.Rollback();
                Log.Error(e.Message);
                Log.Error(e.InnerException.Message);
                throw e;
            }
            finally
            {
                Session.Close();
            }
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Logger.Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion

            return exito;
        }


        /// <summary> Metodo que consulta los datos de un contrato dados los parametros indicados </summary>
        /// <param name="contrato">parametros para la busqueda</param>
        /// <returns>Lista de contrato</returns>
        public IList<Contrato> Consultar(Contrato contrato)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Logger.Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            IList<Contrato> listaEntidad = new List<Contrato>();

            try
            {

                MySqlCommand comando = new MySqlCommand();
                comando.Connection = new MySqlConnection(ConfigurationManager.ConnectionStrings["ConexionMysql"].ToString());
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ConsultarContrato";
                comando.Connection.Open();
                comando.Parameters.AddWithValue("@NombreComercial", string.IsNullOrEmpty(contrato.NombreComercial) ? (object) DBNull.Value : contrato.NombreComercial);
                comando.Parameters.AddWithValue("@FechaInicio", contrato.FechaInicio ?? (object)DBNull.Value);
                comando.Parameters.AddWithValue("@IdCliente", (contrato.Cliente == null) ? (object)DBNull.Value : contrato.Cliente.Id);
                comando.Parameters.AddWithValue("@IdEstablecimiento", (contrato.Establecimiento == null) ? (object)DBNull.Value : contrato.Establecimiento.Id);
                comando.Parameters.AddWithValue("@Estado", (contrato.Estado == -1) ? (object)DBNull.Value : contrato.Estado);

                comando.Parameters["@NombreComercial"].Direction = ParameterDirection.Input;
                comando.Parameters["@FechaInicio"].Direction = ParameterDirection.Input;
                comando.Parameters["@IdCliente"].Direction = ParameterDirection.Input;
                comando.Parameters["@IdEstablecimiento"].Direction = ParameterDirection.Input;
                comando.Parameters["@Estado"].Direction = ParameterDirection.Input;

                #region Instrumentacion Entrada
                if (Log.InfoHabilitado)
                    Logger.Log.Info("antes de Ejecutar el sql");
                #endregion
                MySqlDataReader reader = comando.ExecuteReader();

                #region Instrumentacion Entrada
                if (Log.InfoHabilitado)
                    Logger.Log.Info(" Ejecuto el sql");
                #endregion
                while (reader.Read())
                {
                    var obj = new Contrato();
                    obj.Id = (long) reader[0];
                    obj.PorcentajeVenta = (float) reader[1];
                    obj.FechaInicio = (DateTime) reader[2];
                    obj.FechaFin = (DateTime)reader[3];
                    obj.Establecimiento = new Establecimiento {Id = (long) reader[4]};
                    obj.Estado = (int) reader[7];
                    obj.NombreComercial = (string) reader[8];
                    obj.MontoGarantia = Convert.ToDouble(reader[9]);
                    obj.Cliente = new Cliente { Id = (long)reader[5] };
                    obj.TipoFirma = (string)reader[10];
                    obj.NombreFirmante = (string)reader[11];
                    obj.NombreFirmante2 = reader[12] == DBNull.Value ? string.Empty : (string)reader[12];
                    obj.NombreFirmante3 = reader[13] == DBNull.Value ? string.Empty : (string)reader[13];

                    listaEntidad.Add(obj);

                }

                #region Instrumentacion Salida
                if (Log.InfoHabilitado)
                    Logger.Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
                #endregion
                comando.Connection.Close();
                return listaEntidad;
            }
            catch (Exception e)
            {
                #region Instrumentacion Error
                if (Log.ErrorHabilitado)
                    Logger.Log.Info(e.Message + " " + e.InnerException);
                #endregion
            }
            finally
            {
                Session.Close();
            }
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Logger.Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return listaEntidad;
        }


        /// <summary> Metodo que realiza la accion de vencer todos los contratos que son requeridos</summary>
        public void VencerContratos()
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion

            try
            {

                MySqlCommand comando = new MySqlCommand();
                comando.Connection = new MySqlConnection(ConfigurationManager.ConnectionStrings["ConexionMysql"].ToString());
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "VencerContratos";
                comando.Connection.Open();

                comando.ExecuteNonQuery();

                #region Instrumentacion Salida
                if (Log.InfoHabilitado)
                    Logger.Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
                #endregion
                comando.Connection.Close();
            }
            catch (Exception e)
            {
                #region Instrumentacion Error
                if (Log.ErrorHabilitado)
                    Logger.Log.Info(e.Message + " " + e.InnerException);
                #endregion
            }
            finally
            {
                Session.Close();
            }

            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Logger.Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
        }
    }
}
